package com.tp2.dominio;

import java.util.ArrayList;
import java.util.List;

public class Ticket {

	private List<Producto> items;
	private List<Descuento> descuentos;
	private MedioDePago medioDePago;
	private double subtotal;
	private String estado;

	public Ticket() {

		items = new ArrayList<Producto>();
		descuentos = new ArrayList<Descuento>();
		medioDePago = null;
		subtotal = 0;
		estado = "abierto";
	}

	public String getEstado() {

		return estado;
	}

	public List<Producto> getItems() {
		return items;
	}

	public void setDescuentos(List<Descuento> descuentos) {
		this.descuentos = descuentos;
	}

	public List<Descuento> getDescuentos() {
		return this.descuentos;
	}

	public void agregarItem(Producto producto) throws Exception {

		if (estado.equalsIgnoreCase("abierto")) {
			items.add(producto);
			subtotal += producto.getPrecio();
		} else {

			throw new Exception("Ticket cerrado");
		}

	}

	public int getCantidadItems() {

		return items.size();
	}

	public double getSubtotal() {

		return subtotal;
	}

	public double getTotalDescuentos() {

		double total = 0;
		for (Descuento descuento : this.descuentos) {
			total += descuento.getMonto();
		}

		return total;
	}

	public double getTotal() {

		return subtotal - getTotalDescuentos();

	}

	public MedioDePago getMedioDePago() {

		return medioDePago;
	}

	private void setMedioDePago(MedioDePago medioDePago) {
		this.medioDePago = medioDePago;
	}

	public void cerrar(MedioDePago medioDePago) throws Exception {

		if (getCantidadItems() > 0) {
			estado = "cerrado";
			setMedioDePago(medioDePago);
			CalculadorDeDescuentos calculador = CalculadorDeDescuentos.getInstance();
			this.setDescuentos(calculador.aplicarOfertas(getCopiaItems(), medioDePago));
		} else {

			throw new Exception("Ticket vacio");
		}

	}

	private List<Producto> getCopiaItems() {
		
		List<Producto> productosCopia = new ArrayList<Producto>();
		
		for(Producto producto: getItems()){
			
			productosCopia.add(new Producto(producto));
			
		}
		
		return productosCopia;
	}

}
